package com.mxpio.erp.common.plm.service;

import com.mxpio.erp.common.plm.bo.ProjectTaskBO;
import com.mxpio.erp.common.plm.entity.ProjectInfo;
import com.mxpio.erp.common.plm.entity.ProjectTask;
import com.mxpio.erp.common.plm.entity.ProjectTaskComplete;
import com.mxpio.erp.common.plm.vo.ProjectTaskVO;
import com.mxpioframework.common.vo.Result;
import com.mxpioframework.jpa.query.Criteria;
import com.mxpioframework.system.service.BaseService;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.List;
import java.util.Map;

/**
 *  项目任务表Service接口
 * @author qb
 * @since 2024-2-20
 */
public interface ProjectTaskService extends BaseService<ProjectTask> {
    /**
     * 获取同级任务
     */
    List<ProjectTask> getSameLevelTasks(String proCode, String parentTaskCode);

    /**
     * 获取子任务
     */
    List<ProjectTask> getChildrenTasks(String proCode, String parentTaskCode);

    /**
     * 检查是否存在循环依赖
     */
    boolean checkForCircularDependency(ProjectTask task, String beforeTaskCode);

    Page<ProjectTaskVO> pageApproval(Pageable page, Criteria c);
    /**
     * 新增任务
     */
    Result<?> saveTask(ProjectTask projectTask);
    /**
     * 编辑任务
     */
    Result<?> editTask(ProjectTask projectTask);

    /**
     * 升级任务
     */
    void upgradeTask(String taskCode);

    /**
     * 降级任务
     */
    void downgradeTask(String taskCode);


    /**
     * 上移
     */
    void moveTaskUp(String taskCode);

    /**
     * 下移
     */
    void moveTaskDown(String taskCode);
    /**
     * 开始任务
     */
    void start(ProjectTask projectTask);

    /**
     * 执行任务
     */
    void executeTask(ProjectTask projectTask, ProjectTaskBO projectTaskBO);
    /**
     * 任务完工申请
     */
    void finishTask(ProjectTask projectTask, ProjectTaskBO projectTaskBO);
    /**
     * 任务完工审核
     */
    void finishAudit(ProjectTask projectTask, ProjectTaskBO projectTaskBO);
    /**
     * 任务变更申请
     */
    void  changeTask(ProjectTask projectTask);
    /**
     * 任务变更审核
     */
    void changeAudit(ProjectTask projectTask, ProjectTaskBO projectTaskBO);
    /**
     * 删除任务
     */
    void deleteTask(String taskCode);

    /**
     * 关闭任务
     */
    void closeTask(ProjectTask projectTask, ProjectTaskBO projectTaskBO);

    /**
     * 关闭任务审核
     */
    void closeTaskAudit(ProjectTask projectTask, ProjectTaskBO projectTaskBO);

    /**
     * 更改任务对应的项目信息
     * @param projectInfo
     */
    void change(ProjectInfo projectInfo);

    /**
     * 工作流-任务完工审核
     * @param
     */
    Result<?> finishAuditWorkflows(ProjectTaskBO projectTaskBO);

    Result<?> finishAuditWork(String key, String loginUsername, String businessKey, Map<String, Object> properties);

    Result<?> finishAuditWorkOK(ProjectTaskBO projectTaskBO);

    Page<ProjectTask> headAll(Pageable page, Criteria criteria);

    Result<?> getChildDeliverable(String taskCode,Pageable page,Criteria criteria);
}
